package com.hmall.item.controller;


import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hmall.common.domain.PageDTO;
import com.hmall.item.domain.dto.ItemDTO;
import com.hmall.item.domain.po.Item;
import com.hmall.item.domain.query.ItemPageQuery;
import com.hmall.item.service.IItemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Api(tags = "搜索相关接口")
@RestController
@RequestMapping("/search")
@RequiredArgsConstructor
public class SearchController {

    private final IItemService itemService;

    @ApiOperation("搜索商品")
    @GetMapping("/list")
    public PageDTO<ItemDTO> search(ItemPageQuery query) {


        /**
         * 需求:
         *  需要实现商品分页搜索功能如下：
         * 根据搜索关键字搜索商品标题
         * 根据品牌、分类、价格范围搜索
         * 商品的状态为 1 才能被搜索
         * 根据更新时间降序排序
         * 默认搜索第1页；每页大小默认20条
         * @param query
         * @return
         */

        // TODO 根据条件分页查询，默认根据更新时间降序排序
      /*  //1、创建一个分页对象
        Page<Item> page = Page.of(query.getPageNo(), query.getPageSize());
        //2、创建条件
        LambdaQueryWrapper<Item> itemLambdaQueryWrapper = new LambdaQueryWrapper<>();
        itemLambdaQueryWrapper
                .like(StrUtil.isNotBlank(query.getKey()),Item::getName,query.getKey())
                .eq(StrUtil.isNotBlank(query.getKey()),Item::getCategory,query.getCategory())
                .eq(query.getBrand() != null,Item::getBrand,query.getBrand())
                .ge(query.getMaxPrice() != null,Item::getPrice,query.getMinPrice())
                .le(query.getMaxPrice() != null,Item::getPrice,query.getMaxPrice())
                .eq(Item::getStatus,1)
                .orderByDesc(Item::getUpdateTime);
        //分页查询
        Page<Item> itemPage = page(page, itemLambdaQueryWrapper);
        log.info("分页查询结果：{}",itemPage);
        List<Item> records = itemPage.getRecords();

        List<ItemDTO> itemDTOS = BeanUtils.copyList(records, ItemDTO.class);

        log.info("{}",itemDTOS);
        return itemService.search(query);*/
        LambdaQueryChainWrapper<Item> wrapper = itemService.lambdaQuery()
                .like(StrUtil.isNotBlank(query.getKey()), Item::getName, query.getKey())
                .eq(StrUtil.isNotBlank(query.getKey()), Item::getCategory, query.getCategory())
                .eq(query.getBrand() != null, Item::getBrand, query.getBrand())
                .ge(query.getMaxPrice() != null, Item::getPrice, query.getMinPrice())
                .le(query.getMaxPrice() != null, Item::getPrice, query.getMaxPrice());
        // 排序规则,可能是空
        if (query.getSortBy() != null){
            switch (query.getSortBy()){
                case "price":
                    wrapper.orderBy(true,query.getIsAsc(),Item::getPrice);
                    break;
                case "sales":
                    wrapper.orderBy(true,query.getIsAsc(),Item::getSold);
                    break;
                default:
                    wrapper.orderByDesc(true,Item::getUpdateTime);
                    break;
            }
        }else{
            wrapper.orderBy(true,query.getIsAsc(),Item::getUpdateTime);
        }
        Page<Item> itemPage = wrapper.page(new Page<>(query.getPageNo(), query.getPageSize()));

        return PageDTO.of(itemPage, ItemDTO.class);
    }
}
